package com.phonetools.commonutils.file

import android.util.Log
import java.io.File
import java.io.FileInputStream
import java.text.DecimalFormat

const val SIZETYPE_B = 1//获取文件大小单位为B的double值
const val SIZETYPE_KB = 2//获取文件大小单位为KB的double值
const val SIZETYPE_MB = 3//获取文件大小单位为MB的double值
const val SIZETYPE_GB = 4//获取文件大小单位为GB的double值

/**
 * 以指定单位获取文件或文件夹的大小
 * @param sizeType 获取大小的类型1为B、2为KB、3为MB、4为GB
 * @return double值的大小
 */
fun getFileOrDirSize(path: String, sizeType: Int): Double {
    val file = File(path)
    var blockSize: Long = 0
    try {
        blockSize = if (file.isDirectory) {
            getDirSize(file)
        } else {
            getFileSize(file)
        }
    } catch (e: Exception) {
        e.printStackTrace()
        Log.e("获取文件大小", "获取失败!")
    }

    return formatFileSize(blockSize, sizeType)
}

/**
 * 调用此方法自动计算指定文件或文件夹的大小
 * @return 计算好的带B、KB、MB、GB的字符串
 */
fun getAutoFileOrDirSize(filePath: String): String {
    val file = File(filePath)
    var blockSize: Long = 0
    try {
        blockSize = if (file.isDirectory) {
            getDirSize(file)
        } else {
            getFileSize(file)
        }
    } catch (e: Exception) {
        e.printStackTrace()
        Log.e("获取文件大小", "获取失败!")
    }

    return formatFileSize(blockSize)
}

/**
 * 获取指定文件大小
 * @return Long值的大小
 * @throws Exception
 */
@Throws(Exception::class)
private fun getFileSize(file: File): Long {
    var size: Long = 0
    if (file.exists()) {
        val fis = FileInputStream(file)
        size = fis.available().toLong()
    } else {
        file.createNewFile()
        Log.e("获取文件大小", "文件不存在!")
    }
    return size
}

/**
 * 获取指定文件夹内的文件大小
 * @return Long值的大小
 * @throws Exception
 */
@Throws(Exception::class)
private fun getDirSize(dir: File): Long {
    var size: Long = 0
    val fileList = dir.listFiles()
    for (file in fileList) {
        size = if (file.isDirectory) {
            size + getDirSize(file)
        } else {
            size + getFileSize(file)
        }
    }
    return size
}

/**
 * 文件大小格式化自动
 * @param fileSize 文件大小
 * @return
 */
private fun formatFileSize(fileSize: Long): String {
    val df = DecimalFormat("#.00")
    val wrongSize = "0B"
    if (fileSize == 0L) {
        return wrongSize
    }
    return when {
        fileSize < 1024 -> {
            df.format(fileSize.toDouble()) + "B"
        }
        fileSize < 1048576 -> {
            df.format(fileSize.toDouble() / 1024) + "KB"
        }
        fileSize < 1073741824 -> {
            df.format(fileSize.toDouble() / 1048576) + "MB"
        }
        else -> {
            df.format(fileSize.toDouble() / 1073741824) + "GB"
        }
    }
}

/**
 * 转换文件大小,指定转换的类型
 *
 * @param fileSize
 * @param sizeType
 * @return
 */
private fun formatFileSize(fileSize: Long, sizeType: Int): Double {
    val df = DecimalFormat("#.00")
    return when (sizeType) {
        SIZETYPE_B -> {
            java.lang.Double.valueOf(df.format(fileSize.toDouble()))
        }
        SIZETYPE_KB -> {
            java.lang.Double.valueOf(df.format(fileSize.toDouble() / 1024))
        }
        SIZETYPE_MB -> {
            java.lang.Double.valueOf(df.format(fileSize.toDouble() / 1048576))
        }
        SIZETYPE_GB -> {
            java.lang.Double.valueOf(df.format(fileSize.toDouble() / 1073741824))
        }
        else -> {
            java.lang.Double.valueOf(df.format(fileSize.toDouble()))
        }
    }
}

